package com.rtx.api.aspect;

import com.alibaba.fastjson.JSON;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 日志切面
 */
@Component
@Aspect
public class ApiLogAspect {

    private final Logger logger = LoggerFactory.getLogger(ApiLogAspect.class);

    /**
     * 切入点
     */
    @Pointcut("execution(* com.rtx.api.controller..*.*(..))")
    public void apiLog(){}

    /**
     * 全局异常切入点
     */
    @Pointcut("execution(* com.rtx.api.config.GlobalExceptionConfig.*(..))")
    public void globalException(){}

    /**
     * 前置通知
     * @param joinPoint
     */
    @Before("apiLog()")
    public void doBefore(JoinPoint joinPoint){
        // 打印请求信息
        logger.info("入参：{}",JSON.toJSONString(joinPoint.getArgs()));
    }

    /**
     * 通知：全局异常通知
     * 处理全局异常日志信息
     * @param joinPoint
     */
    @AfterReturning(pointcut = "globalException()", returning = "obj")
    public void globalException(JoinPoint joinPoint, Object obj) {
        // 处理日志信息
        logger.info("出参：{}", JSON.toJSONString(obj));
    }

    /**
     * 通知：后置通知
     * 处理请求日志信息
     * @param joinPoint
     */
    @AfterReturning(pointcut = "apiLog()", returning = "obj")
    public void doAfterReturning(JoinPoint joinPoint, Object obj) {
        // 处理日志信息
        logger.info("出参：{}", JSON.toJSONString(obj));
    }

    /**
     * 处理日志
     * @param joinPoint
     * @param obj
     */
    private void handleLog(JoinPoint joinPoint, Object obj) {

    }
}
